#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <memory>

template<typename... Args>
inline std::string fmtstr(const std::string &format, Args... args) {
    int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1;
    if (size_s <= 0) {
        throw std::runtime_error("Error during formatting.");
    }
    size_t size = static_cast<size_t>(size_s);
    std::unique_ptr<char> buf(new char[size]); // 使用char[]而非char*
    std::snprintf(buf.get(), size, format.c_str(), args...);
    return std::string(buf.get(), buf.get() + size - 1);
}

template<typename T>
inline std::string vec2str(std::vector<T> vec) { // 将stdLLvector修改为std::vector
    std::stringstream ss;
    ss << "[";
    if (!vec.empty()) {
        for (size_t i = 0; i < vec.size(); ++i) {
            ss << vec[i];
            if (i != vec.size() - 1) ss << ", "; // 在最后一个元素后不加逗号和空格
        }
    }
    ss << "]";
    return ss.str();
}

template<typename T>
inline std::string arr2str(T *arr, size_t size) {
    std::stringstream ss;
    ss << "[";
    if (arr != nullptr) {
        for (int i = 0; i < size; ++i) {
            ss << *(arr+i);
            if (i != size - 1) ss << ", "; // 在最后一个元素后不加逗号和空格
        }
    }
    ss << "]";
    return ss.str();
}